#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

//

/***************************************************************************************************************
修改原因：头文件写到函数体中去
好处：可以避免人家随便使用我的头文件
****************************************************************************************************************/
class QDomDocument;
class QMessageBox;
class QStandardItemModel;
class QStandardItem;
class QFileDialog;
class QString;
class QDebug;
class QDomElement;
class topTable;
class leftTable;
class parseProtocol;
class ASDUparse;
class rightDisplay;


//节点宏定义：

#define LENGTHNODE 2        //长度节点
#define CONTROL1 4              //控制节点1
#define CONTROL2 6              //控制节点2
#define CONTROL3 8              //控制节点3
#define CONTROL4 10            //控制节点4
#define TYPENODE 12             //类型标识节点
#define CANCHANGE 14        //可变结构限定词
#define TRANSFERRESON 16 //传送原因
#define COMMONADDRESS 20 //公共地址
#define INFORMATIONADDRESS 24//信息对象首地址




//#define


namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private:    
    Ui::MainWindow *ui;

    //私有变量 ：


    topTable *_ptopTable;//->顶栏对象
    leftTable *_leftTable;//->左栏对象
    parseProtocol *_parseProtocol;//->解析104
    ASDUparse *_ASDUparse;//->解析ASDU
    rightDisplay *_rightDisplay;//->解析信息字


    //XML文件读写

    QStandardItemModel *modelLeft;//letf的数据源
    QString zhen_data;


    bool ok;//为转16进制设定的

    //节点值
    QStandardItem *item_root;//根节点
    QStandardItem *item_68;//启动节点
    QStandardItem *item_length;//解析长度
    QStandardItem *item_control1;//控制节点总结点；
    QStandardItem *item_control11;//控制节点1
    QStandardItem *item_control12;//控制节点2
    QStandardItem *item_control13;//控制节点3
    QStandardItem *item_control14;//控制节点4
    QStandardItem *item_type;         //类型标识
    QStandardItem *item_change;   //可变结构限定词
    QStandardItem *item_transferreason;//传输原因
    QStandardItem *item_address;//传送地址




    //右栏：信息位解析：
    int p_sq;//记录离散或者顺序的
    int p_type;//记录信息类型
    int p_num;//记录信息体个数






private:
    //私有函数
    //上层

    void pInitbrieftable();//初始化brieftable

     //左层
    void pInitleftTable();  // 初始化letftable

    //右层
    void pInformation(const QString data_parse);//展示信息字
    void _rightTable();//展示信息字

    //信息元素解析库
    QString pParseSIQ(int data_parse);//1带品质描述词的单点信息(IEV 371-02-07)(SIQ)——
    QString pParseDIQ(int data_parse);//2带品质描述词的双点信息(IEV 371-02-08)(DIQ)——
    QString pParseQDS(int data_parse);//3品质描述词(单个八位位组)(QDS）——
    QString pParseQDP(int data_parse);//4继电保护设备事件的品质描述词(单个的八位位组 QDP)——
    QString pParseVTI(int data_parse);//5带瞬变状态指示的值，用于变压器的步位置或者其他步位置信息(VTI)
    QString pParseNVA(int data_parse);//6归一化值
    QString pParseSVA(int data_parse);//7标度化值
    QString pParseR32IEEE(int data_parse);//8短浮点数
    QString pParseBCR(int data_parse);//9二进制计数器——
    QString pParseSEPOne(int data_parse);//10机电保护设备单个事件
    QString pParseSEPTwo(int data_parse);//11继电保护设备启动事件
    QString pParseOCI(int data_parse);//12继电保护设备输出电路信息
    QString pParseBSI(int data_parse);//13二进制状态信息
    QString pParseFBP(int data_parse);//14固定测试字，两个八位组
    QString pParseSCO(int data_parse);//15单命令
    QString pParseDCO(int data_parse);//16双命令
    QString pParseRCO(int data_parse);//17步调节命令
    QString pParseCP56Time2a(int data_parse);//18七个八位组二进制时间
    QString pParseCP24Time2a(int data_parse);//19三个八位组二进制时间
    QString pParseCP16Time2a(int data_parse);//20两个八位组二进制时间
    QString pParseCOI(int data_parse);//21初始化原因
    QString pParseQOI(int data_parse);//22召唤限定词
    QString pParseQCC(int data_parse);//23计量召唤限定词
    QString pParseQPM(int data_parse);//24测量参数限定词
    QString pParseQPA(int data_parse);//25参数激活限定词
    QString pParseQOC(int data_parse);//26命令限定词
    QString pParseQRP(int data_parse);//27复位进程命令限定词
    QString pParseFRQ(int data_parse);//28文件准备就绪限定词
    QString pParseSRQ(int data_parse);//29节准备就绪限定词
    QString pParseSCQ(int data_parse);//30选择和召唤限定词
    QString pParseLSQ(int data_parse);//31最后的节和段的限定词
    QString pParseAFQ(int data_parse);//32 文件认可或节认可限定词
    QString pParseNOF(int data_parse);//33文件名称
    QString pParseNOS(int data_parse);//34节名称
    QString pParseLOF(int data_parse);//35文件或节的长度
    QString pParseLOS(int data_parse);//36段的长度
    QString pParseCHS(int data_parse);//37校验和
    QString pParseSOF(int data_parse);//38文件的状态
    QString pParseQOS(int data_parse);//39设定命令限定词
    QString pParseSCD(int data_parse);//40状态和状态变为检出


private slots:
    void popenFile();
    void on_treeView_clicked(const QModelIndex &index);
};

#endif // MAINWINDOW_H
